Read in the packages. The working directory is wherever the R Notebook is located.

Read in the spreadsheet and take a look at the data.

###read in spreadsheet
loc <- read_xlsx("Original-spreadsheets/all species New_6-14-19.xlsx") %>% 
  janitor::clean_names() %>% 
  mutate(reproductive_mode = as.factor(reproductive_mode)) 

#get the number of individuals, and the sexuality counts per species
count_repro_mode <- loc %>% 
  group_by(genus, species, reproductive_mode) %>% 
  count() %>% 
  mutate(genus_species = str_c(genus, species, sep = "_"),
         genus_species = str_replace_all(genus_species, " ", "_"),
         genus_species = str_replace_all(genus_species, "\\.", "")) %>% 
  ungroup() %>% 
  mutate(genus_species = fct_reorder(genus_species, n, sum)) %>% 
  ggplot(aes(x = genus_species, y = n, fill = reproductive_mode)) +
  geom_col() +
  coord_flip() + 
  theme_minimal()

count_repro_mode

##Map Plot a leaflet map of the localities. The leaflet map is interactive. You can click on the localities and a flag with some metadata will pop up!

#make locality shape file and assign WGS coord system
coord_points <- st_as_sf(loc, coords = c("longitude", "latitude"), 
                         crs = 4326, agr = "constant")

#use sourced plot_locs_leaflet script to plot localities
all_plot <- plot_locs_leaflet(loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
all_plot

#in case I want to save the map somewhere
#mapview::mapshot(all_plot, url = paste0(getwd(), "/plots/repro_mode_plots/all_species_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/all_species_map.pdf"))

##PCA-Genera {.tabset}

###Climate Data Obtain the bioclim layers for analysis. I’m using all 19 for this preliminary exploration. I plotted the first bioclim just to make sure nothing seems wonky. I’m using CHELSA data downloaded from their website. Since the files are huge, I only unzip them one at a time, crop them, and write them to GeoTiff files that I can then load in as a rasterstack.

##get chelsa data
#chelsa_folder <- "/Users/connorfrench/Dropbox/Old_Mac/climate-data/chelsa_30s_bio"
#zip_files <- list.files(chelsa_folder, full.names = TRUE)

#using the Unarchiver commandline tools for Mac to unzip the 7zip chelsa layers. Regular unzip() does not work with 7z zipped files
#for (file in zip_files) {
  #set temp directory
#  tempd <- tempdir()
#  system(paste("unar", file, "-o", tempd))
#  r <- raster(list.files(tempd, pattern = "*.tif", full.names = TRUE)) %>%
#    crop(extent(166, 179, -48, -34))
#  writeRaster(r, filename = paste0("~/Desktop/", list.files(tempd, pattern = "*.tif")), format = "GTiff")
#  unlink(tempd, recursive = TRUE)
#}

clim_files <- "/Users/connorfrench/Dropbox/Old_Mac/climate-data/chelsa_30sec_NewZealand/chelsa_bioclims_NZ.tif"
w <- stack(clim_files)

###PCA by locality This is a PCA of the climate data extracted for each locality, rather than a PCA of the total climate space.

Run the pca and check out variable loadings and proportion of variance explained by components.

#extract data from worldclim for each locality. Making this into a data frame with columns labeled so the row labeling lines up after I remove the NAs.
#extract data from worldclim for each locality.
coords <- data.frame(latitude = loc$longitude, longitude = loc$latitude)

loc.clim <- dplyr::bind_cols(loc, raster::extract(w, coords, method = "simple", df = TRUE)) %>% 
  drop_na(chelsa_bioclims_NZ.1) %>% 
  dplyr::select(-ID)

#make a matrix of only bioclim values
clim.mat <- loc.clim[,grep("bio", names(loc.clim))] %>% as.matrix()

#run pca on climate variables
clim.pca <- prcomp(clim.mat, scale = TRUE)
summary.pca <- summary(clim.pca) #check out the components

#plot tables
summary.pca
Importance of components:
                          PC1    PC2     PC3     PC4     PC5     PC6     PC7     PC8     PC9    PC10
Standard deviation     2.9511 2.4947 1.36934 1.02403 0.80149 0.54359 0.32182 0.24972 0.11677 0.10148
Proportion of Variance 0.4584 0.3276 0.09869 0.05519 0.03381 0.01555 0.00545 0.00328 0.00072 0.00054
Cumulative Proportion  0.4584 0.7859 0.88462 0.93981 0.97362 0.98917 0.99462 0.99790 0.99862 0.99916
                          PC11    PC12    PC13    PC14    PC15    PC16    PC17    PC18    PC19
Standard deviation     0.08340 0.05671 0.04746 0.03910 0.03147 0.02392 0.01408 0.01153 0.00911
Proportion of Variance 0.00037 0.00017 0.00012 0.00008 0.00005 0.00003 0.00001 0.00001 0.00000
Cumulative Proportion  0.99953 0.99970 0.99982 0.99990 0.99995 0.99998 0.99999 1.00000 1.00000
knitr::kable(round(clim.pca$rotation[,1:3],3)) #Table of loading scores for the first 3 PCs.
PC1 PC2 PC3
chelsa_bioclims_NZ.1 -0.301 0.148 0.174
chelsa_bioclims_NZ.2 -0.285 0.143 0.276
chelsa_bioclims_NZ.3 -0.310 0.142 0.097
chelsa_bioclims_NZ.4 -0.150 -0.358 0.010
chelsa_bioclims_NZ.5 -0.189 -0.327 0.024
chelsa_bioclims_NZ.6 -0.135 -0.362 -0.003
chelsa_bioclims_NZ.7 -0.169 0.136 0.089
chelsa_bioclims_NZ.8 -0.188 -0.328 0.031
chelsa_bioclims_NZ.9 -0.130 -0.365 -0.006
chelsa_bioclims_NZ.10 -0.119 -0.361 -0.036
chelsa_bioclims_NZ.11 -0.214 -0.280 0.094
chelsa_bioclims_NZ.12 0.277 -0.106 0.360
chelsa_bioclims_NZ.13 0.261 -0.105 0.306
chelsa_bioclims_NZ.14 0.248 -0.083 0.383
chelsa_bioclims_NZ.15 -0.219 0.123 0.492
chelsa_bioclims_NZ.16 -0.314 0.143 0.009
chelsa_bioclims_NZ.17 0.272 -0.106 0.380
chelsa_bioclims_NZ.18 -0.167 0.128 -0.084
chelsa_bioclims_NZ.19 -0.247 0.100 0.317

Two plots: One plot of the PCA colored according to genus, with convex hulls surrounding the genera. It looks like this reflects a latitudinal gradient in temperature! You can interact with the PCA plot by clicking on points to view associated metadata. You can isolate the genus you want to view by double clicking the genus in the legend! You can also remove a genus by clicking on it once. There’s some other functionality you can explore in the toolbar at the top of the plot. The second plot is a PCA colored according to reproductive mode. It looks like asexual populations occupy slightly larger niche space, but both reproductive modes have a similar niche center.


#add pca results to loc.clim data frame
loc.clim <- data.frame(loc.clim, clim.pca$x)

#use sourced plot_clim_pca function to plot the pca results. args are the data set with species names and PC axis values and the pca summary
all_pca <- plot_clim_pca(loc.clim, summary.pca, factor = "genus")
Ignoring unknown aesthetics: text
all_pca


#use sourced plot_clim_pca function to plot the pca results. args are the data set with species names and PC axis values and the pca summary
repro_pca <- plot_clim_pca(loc.clim, summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
repro_pca


#save the plot colored by genus
#htmlwidgets::saveWidget(all_pca, paste0(getwd(), "/plots/repro_mode_plots/all_species_pca_genus.html"), selfcontained = TRUE)

#save the plot colored by reproductive mode
#htmlwidgets::saveWidget(repro_pca, paste0(getwd(), "/plots/repro_mode_plots/all_species_pca_repro.html"), selfcontained = TRUE)

##PCA-Species {.tabset} These are PCAs of environmental space for species within genera. Each climate PCA is of localities for a single genus, colored by species. I’m doing this even for genera with one species, so it’s easy to see if certain localities group together.

###Acanthoxyla

#source function to conduct a PCA on individual species
summary.list.acan <- species_pca_fun(loc.clim, "acanthoxyla")
#plot
acan_plot <- plot_clim_pca(summary.list.acan$loc.clim, summary.list.acan$summary.pca, "reproductive_mode")
Ignoring unknown aesthetics: text
acan_plot


#save pca plot
#htmlwidgets::saveWidget(acan_plot, paste0(getwd(), "/plots/repro_mode_plots/acanthoxyla_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
acan_loc <- loc %>% 
  filter(genus == "acanthoxyla")
  
#use sourced plot_locs_leaflet script to plot localities
acan_map <- plot_locs_leaflet(acan_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
acan_map


#in case I want to save the map somewhere
#mapview::mapshot(acan_map, url = paste0(getwd(), "/plots/repro_mode_plots/acan_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/acan_map.pdf"))
summary.list.acan$summary.pca
Importance of components:
                          PC1    PC2    PC3     PC4     PC5     PC6     PC7     PC8    PC9    PC10
Standard deviation     2.8059 2.5135 1.7771 0.88976 0.66876 0.44564 0.36423 0.22139 0.1064 0.09506
Proportion of Variance 0.4144 0.3325 0.1662 0.04167 0.02354 0.01045 0.00698 0.00258 0.0006 0.00048
Cumulative Proportion  0.4144 0.7469 0.9131 0.95475 0.97829 0.98874 0.99573 0.99831 0.9989 0.99938
                          PC11    PC12    PC13    PC14    PC15    PC16    PC17    PC18    PC19
Standard deviation     0.06761 0.05169 0.03848 0.03336 0.02780 0.02371 0.01891 0.01400 0.01128
Proportion of Variance 0.00024 0.00014 0.00008 0.00006 0.00004 0.00003 0.00002 0.00001 0.00001
Cumulative Proportion  0.99962 0.99976 0.99984 0.99989 0.99993 0.99996 0.99998 0.99999 1.00000
loadings.acan <- summary.list.acan$summary.pca$rotation
knitr::kable(round(loadings.acan[,1:3],3)) #Table of loading scores for the first 3 PCs. 
PC1 PC2 PC3
chelsa_bioclims_NZ.1 -0.266 -0.230 0.170
chelsa_bioclims_NZ.2 -0.238 -0.200 0.297
chelsa_bioclims_NZ.3 -0.277 -0.240 0.056
chelsa_bioclims_NZ.4 0.262 -0.267 0.039
chelsa_bioclims_NZ.5 0.236 -0.288 0.068
chelsa_bioclims_NZ.6 0.268 -0.258 0.015
chelsa_bioclims_NZ.7 -0.192 -0.051 0.217
chelsa_bioclims_NZ.8 0.239 -0.286 0.073
chelsa_bioclims_NZ.9 0.269 -0.256 0.012
chelsa_bioclims_NZ.10 0.272 -0.249 -0.011
chelsa_bioclims_NZ.11 0.191 -0.283 0.148
chelsa_bioclims_NZ.12 0.219 0.232 0.285
chelsa_bioclims_NZ.13 0.232 0.246 0.151
chelsa_bioclims_NZ.14 0.128 0.138 0.463
chelsa_bioclims_NZ.15 -0.150 -0.097 0.477
chelsa_bioclims_NZ.16 -0.278 -0.245 -0.034
chelsa_bioclims_NZ.17 0.197 0.197 0.370
chelsa_bioclims_NZ.18 -0.074 -0.304 -0.109
chelsa_bioclims_NZ.19 -0.246 -0.049 0.321

###Argosarchus

#conduct pca
summary.list.argo <- species_pca_fun(loc.clim, "argosarchus")
#plot
argo_plot <- plot_clim_pca(summary.list.argo$loc.clim, summary.list.argo$summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
argo_plot


#if selfcontained = TRUE, you can remove the folder that gets added alongside the plot. It's an annoying bug that hasn't been fixed yet.
#htmlwidgets::saveWidget(argo_plot, paste0(getwd(), "/plots/repro_mode_plots/argosarchus_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
argo_loc <- loc %>% 
  filter(genus == "argosarchus")
  
#use sourced plot_locs_leaflet script to plot localities
argo_map <- plot_locs_leaflet(argo_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
argo_map


#in case I want to save the map somewhere
#mapview::mapshot(argo_map, url = paste0(getwd(), "/plots/repro_mode_plots/argo_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/argo_map.pdf"))
summary.list.argo$summary.pca
Importance of components:
                          PC1    PC2    PC3     PC4     PC5     PC6     PC7    PC8     PC9    PC10
Standard deviation     2.8508 2.4341 1.6389 1.09192 0.76813 0.51507 0.35817 0.2222 0.10883 0.10035
Proportion of Variance 0.4277 0.3118 0.1414 0.06275 0.03105 0.01396 0.00675 0.0026 0.00062 0.00053
Cumulative Proportion  0.4277 0.7396 0.8809 0.94367 0.97473 0.98869 0.99544 0.9980 0.99866 0.99919
                          PC11    PC12    PC13    PC14    PC15    PC16    PC17    PC18    PC19
Standard deviation     0.08126 0.05441 0.04318 0.03895 0.03285 0.02417 0.01722 0.01643 0.01134
Proportion of Variance 0.00035 0.00016 0.00010 0.00008 0.00006 0.00003 0.00002 0.00001 0.00001
Cumulative Proportion  0.99954 0.99970 0.99980 0.99988 0.99993 0.99996 0.99998 0.99999 1.00000
loadings.argo <- summary.list.argo$summary.pca$rotation
knitr::kable(round(loadings.argo[,1:3],3)) #Table of loading scores for the first 3 PCs. 
PC1 PC2 PC3
chelsa_bioclims_NZ.1 -0.266 -0.227 -0.182
chelsa_bioclims_NZ.2 -0.241 -0.208 -0.293
chelsa_bioclims_NZ.3 -0.279 -0.228 -0.110
chelsa_bioclims_NZ.4 -0.225 0.312 -0.037
chelsa_bioclims_NZ.5 -0.257 0.272 -0.023
chelsa_bioclims_NZ.6 -0.202 0.330 -0.026
chelsa_bioclims_NZ.7 -0.141 -0.175 0.021
chelsa_bioclims_NZ.8 -0.255 0.275 -0.033
chelsa_bioclims_NZ.9 -0.197 0.334 -0.030
chelsa_bioclims_NZ.10 -0.176 0.347 0.013
chelsa_bioclims_NZ.11 -0.277 0.219 -0.090
chelsa_bioclims_NZ.12 0.266 0.149 -0.318
chelsa_bioclims_NZ.13 0.267 0.108 -0.280
chelsa_bioclims_NZ.14 0.227 0.162 -0.310
chelsa_bioclims_NZ.15 -0.113 -0.143 -0.516
chelsa_bioclims_NZ.16 -0.291 -0.224 -0.009
chelsa_bioclims_NZ.17 0.258 0.163 -0.324
chelsa_bioclims_NZ.18 -0.098 -0.073 0.247
chelsa_bioclims_NZ.19 -0.191 -0.155 -0.384

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

###Asteliaphasma

#pca
summary.list.aste <- species_pca_fun(loc.clim, "asteliaphasma")
#plot
aste_plot <- plot_clim_pca(summary.list.aste$loc.clim, summary.list.aste$summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
aste_plot


#if selfcontained = TRUE, you can remove the folder that gets added alongside the plot. It's an annoying bug that hasn't been fixed yet.
#htmlwidgets::saveWidget(aste_plot, paste0(getwd(), "/plots/repro_mode_plots/asteliaphasma_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
aste_loc <- loc %>% 
  filter(genus == "asteliaphasma")
  
#use sourced plot_locs_leaflet script to plot localities
aste_map <- plot_locs_leaflet(aste_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
aste_map


#in case I want to save the map somewhere
#mapview::mapshot(aste_map, url = paste0(getwd(), "/plots/repro_mode_plots/aste_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/aste_map.pdf"))
summary.list.aste$summary.pca
Importance of components:
                         PC1    PC2     PC3     PC4     PC5     PC6     PC7     PC8    PC9    PC10
Standard deviation     3.104 2.4714 1.27720 0.87566 0.76781 0.38573 0.19883 0.16377 0.1382 0.10580
Proportion of Variance 0.507 0.3215 0.08586 0.04036 0.03103 0.00783 0.00208 0.00141 0.0010 0.00059
Cumulative Proportion  0.507 0.8284 0.91427 0.95463 0.98566 0.99349 0.99557 0.99698 0.9980 0.99858
                          PC11    PC12    PC13    PC14    PC15    PC16    PC17    PC18    PC19
Standard deviation     0.09487 0.09187 0.06475 0.04986 0.03308 0.03192 0.02037 0.01726 0.01092
Proportion of Variance 0.00047 0.00044 0.00022 0.00013 0.00006 0.00005 0.00002 0.00002 0.00001
Cumulative Proportion  0.99905 0.99949 0.99971 0.99984 0.99990 0.99996 0.99998 0.99999 1.00000
loadings.aste <- summary.list.aste$summary.pca$rotation
knitr::kable(round(loadings.aste[,1:3],3)) #Table of loading scores for the first 3 PCs. 
PC1 PC2 PC3
chelsa_bioclims_NZ.1 -0.298 -0.090 -0.229
chelsa_bioclims_NZ.2 -0.288 -0.043 -0.320
chelsa_bioclims_NZ.3 -0.298 -0.118 -0.173
chelsa_bioclims_NZ.4 0.198 -0.312 -0.110
chelsa_bioclims_NZ.5 0.134 -0.357 -0.040
chelsa_bioclims_NZ.6 0.209 -0.281 -0.137
chelsa_bioclims_NZ.7 -0.167 -0.205 0.152
chelsa_bioclims_NZ.8 0.143 -0.352 -0.071
chelsa_bioclims_NZ.9 0.214 -0.276 -0.148
chelsa_bioclims_NZ.10 0.187 -0.284 -0.161
chelsa_bioclims_NZ.11 0.164 -0.334 -0.085
chelsa_bioclims_NZ.12 0.250 0.211 -0.238
chelsa_bioclims_NZ.13 0.230 0.192 -0.354
chelsa_bioclims_NZ.14 0.266 0.202 -0.053
chelsa_bioclims_NZ.15 -0.103 0.170 -0.654
chelsa_bioclims_NZ.16 -0.295 -0.154 -0.044
chelsa_bioclims_NZ.17 0.257 0.216 -0.192
chelsa_bioclims_NZ.18 -0.297 -0.125 -0.157
chelsa_bioclims_NZ.19 -0.211 -0.027 -0.154

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

###Clitarchus

summary.list.clita <- species_pca_fun(loc.clim, "clitarchus")
clita_plot <- plot_clim_pca(summary.list.clita$loc.clim, summary.list.clita$summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
clita_plot


#if selfcontained = TRUE, you can remove the folder that gets added alongside the plot. It's an annoying bug that hasn't been fixed yet.
#htmlwidgets::saveWidget(clita_plot, paste0(getwd(), "/plots/repro_mode_plots/clitarchus_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
clita_loc <- loc %>% 
  filter(genus == "clitarchus")
  
#use sourced plot_locs_leaflet script to plot localities
clita_map <- plot_locs_leaflet(clita_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
clita_map


#in case I want to save the map somewhere
#mapview::mapshot(clita_map, url = paste0(getwd(), "/plots/repro_mode_plots/clita_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/clita_map.pdf"))
```r
summary.list.clita$summary.pca
loadings.clita <- summary.list.clita$summary.pca$rotation
knitr::kable(round(loadings.clita[,1:3],3)) #Table of loading scores for the first 3 PCs. 

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



Now I'm going to to environmental niche factor analysis between sexual and asexual populations within the species.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llc1xuY2hvb19iZ19lbnYgPC0gYmdfZW52X2Nyb3AoY2xpdGFfbG9jLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSBcImhvb2tlcmlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ID0gdywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAwLjUpXG5cbiNlbmZhIGZvciB0aGUgc2V4dWFsIHNwZWNpZXNcbmNob29fc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gY2xpdGFfbG9jLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gXCJob29rZXJpXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gXCJzZXh1YWxcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBjaG9vX2JnX2VudilcblxuI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXNcbmNob29fYXNleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IGNsaXRhX2xvYywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSBcImhvb2tlcmlcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gXCJhc2V4dWFsXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IGNob29fYmdfZW52KVxuXG5cbiNwbG90IHRoZSBtYXJnaW5hbGl0eSBzY29yZXNcbm1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gY2hvb19zZXh1YWxfZW5mYSRtLCBcbiAgICAgICAgICAgICAgICAgICAgYXNleF9tYXJnID0gY2hvb19hc2V4dWFsX2VuZmEkbSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbF9zcGVjaWVzX25hbWUgPSBcIkNsaXRhcmNodXMgaG9va2VyaVwiKVxuXG5gYGAifQ== -->

```r
#get background env't for the species
choo_bg_env <- bg_env_crop(clita_loc, 
                           species = "hookeri",
                           environment = w, 
                           buffer = 0.5)

#enfa for the sexual species
choo_sexual_enfa <- enfa_calc_fun(locs = clita_loc, 
                                  species = "hookeri", 
                                  reproductive_mode = "sexual", 
                                  mask_raster = choo_bg_env)

#enfa for the asexual species
choo_asexual_enfa <- enfa_calc_fun(locs = clita_loc, 
                                   species = "hookeri", 
                                   reproductive_mode = "asexual", 
                                   mask_raster = choo_bg_env)


#plot the marginality scores
marginality_lollipop(sex_marg = choo_sexual_enfa$m, 
                    asex_marg = choo_asexual_enfa$m,
                    full_species_name = "Clitarchus hookeri")

###Micrarchus

summary.list.micra <- species_pca_fun(loc.clim, "micrarchus")
micra_plot <- plot_clim_pca(summary.list.micra$loc.clim, summary.list.micra$summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
micra_plot


#if selfcontained = TRUE, you can remove the folder that gets added alongside the plot. It's an annoying bug that hasn't been fixed yet.
#htmlwidgets::saveWidget(micra_plot, paste0(getwd(), "/plots/repro_mode_plots/micrarchus_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
micra_loc <- loc %>% 
  filter(genus == "micrarchus")
  
#use sourced plot_locs_leaflet script to plot localities
micra_map <- plot_locs_leaflet(micra_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
micra_map


#in case I want to save the map somewhere
mapview::mapshot(micra_map, url = paste0(getwd(), "/plots/repro_mode_plots/micra_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/micra_map.pdf"))
summary.list.micra$summary.pca
Importance of components:
                          PC1    PC2     PC3     PC4     PC5    PC6     PC7     PC8     PC9    PC10
Standard deviation     3.4431 2.0743 1.31392 0.94676 0.29817 0.2263 0.20567 0.13292 0.09179 0.08909
Proportion of Variance 0.6239 0.2265 0.09086 0.04718 0.00468 0.0027 0.00223 0.00093 0.00044 0.00042
Cumulative Proportion  0.6239 0.8504 0.94126 0.98843 0.99311 0.9958 0.99803 0.99896 0.99941 0.99983
                          PC11    PC12    PC13    PC14    PC15    PC16     PC17     PC18     PC19
Standard deviation     0.03357 0.02983 0.02512 0.01449 0.01179 0.01068 0.009585 0.008206 0.007186
Proportion of Variance 0.00006 0.00005 0.00003 0.00001 0.00001 0.00001 0.000000 0.000000 0.000000
Cumulative Proportion  0.99988 0.99993 0.99996 0.99998 0.99998 0.99999 0.999990 1.000000 1.000000
loadings.micra <- summary.list.micra$summary.pca$rotation
knitr::kable(round(loadings.micra[,1:3],3)) #Table of loading scores for the first 3 PCs. 
PC1 PC2 PC3
chelsa_bioclims_NZ.1 0.268 0.116 -0.222
chelsa_bioclims_NZ.2 0.266 0.086 -0.270
chelsa_bioclims_NZ.3 0.268 0.143 -0.178
chelsa_bioclims_NZ.4 -0.242 0.257 -0.101
chelsa_bioclims_NZ.5 -0.237 0.254 -0.107
chelsa_bioclims_NZ.6 -0.239 0.251 -0.153
chelsa_bioclims_NZ.7 0.145 -0.116 -0.015
chelsa_bioclims_NZ.8 -0.237 0.254 -0.118
chelsa_bioclims_NZ.9 -0.239 0.253 -0.144
chelsa_bioclims_NZ.10 -0.240 0.250 -0.147
chelsa_bioclims_NZ.11 -0.229 0.252 -0.102
chelsa_bioclims_NZ.12 -0.167 -0.323 -0.354
chelsa_bioclims_NZ.13 -0.140 -0.310 -0.429
chelsa_bioclims_NZ.14 -0.195 -0.325 -0.202
chelsa_bioclims_NZ.15 0.247 0.004 -0.397
chelsa_bioclims_NZ.16 0.268 0.170 -0.110
chelsa_bioclims_NZ.17 -0.190 -0.311 -0.294
chelsa_bioclims_NZ.18 0.210 0.226 -0.306
chelsa_bioclims_NZ.19 0.267 0.119 -0.185

###Niveaphasma

summary.list.nive <- species_pca_fun(loc.clim, "niveaphasma")
nive_plot <- plot_clim_pca(summary.list.nive$loc.clim, summary.list.nive$summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
nive_plot


#if selfcontained = TRUE, you can remove the folder that gets added alongside the plot. It's an annoying bug that hasn't been fixed yet.
#htmlwidgets::saveWidget(nive_plot, paste0(getwd(), "/plots/repro_mode_plots/niveaphasma_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
nive_loc <- loc %>% 
  filter(genus == "niveaphasma")
  
#use sourced plot_locs_leaflet script to plot localities
nive_map <- plot_locs_leaflet(nive_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
nive_map


#in case I want to save the map somewhere
#mapview::mapshot(nive_map, url = paste0(getwd(), "/plots/repro_mode_plots/nive_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/nive_map.pdf"))
summary.list.nive$summary.pca
Importance of components:
                          PC1    PC2    PC3     PC4     PC5     PC6     PC7     PC8     PC9    PC10
Standard deviation     2.9922 2.4493 1.5457 0.94013 0.73205 0.39659 0.24024 0.11345 0.06508 0.04982
Proportion of Variance 0.4712 0.3157 0.1258 0.04652 0.02821 0.00828 0.00304 0.00068 0.00022 0.00013
Cumulative Proportion  0.4712 0.7870 0.9127 0.95923 0.98743 0.99571 0.99875 0.99943 0.99965 0.99978
                          PC11    PC12    PC13    PC14    PC15    PC16    PC17     PC18     PC19
Standard deviation     0.04382 0.02749 0.02222 0.01856 0.01631 0.01216 0.01109 0.008331 0.006935
Proportion of Variance 0.00010 0.00004 0.00003 0.00002 0.00001 0.00001 0.00001 0.000000 0.000000
Cumulative Proportion  0.99988 0.99992 0.99995 0.99997 0.99998 0.99999 0.99999 1.000000 1.000000
loadings.nive <- summary.list.nive$summary.pca$rotation
knitr::kable(round(loadings.nive[,1:3],3)) #Table of loading scores for the first 3 PCs. 
PC1 PC2 PC3
chelsa_bioclims_NZ.1 0.091 0.374 0.184
chelsa_bioclims_NZ.2 -0.002 0.341 0.347
chelsa_bioclims_NZ.3 0.156 0.358 0.053
chelsa_bioclims_NZ.4 0.297 -0.154 0.159
chelsa_bioclims_NZ.5 0.294 -0.151 0.172
chelsa_bioclims_NZ.6 0.297 -0.158 0.135
chelsa_bioclims_NZ.7 -0.196 0.021 0.110
chelsa_bioclims_NZ.8 0.296 -0.143 0.177
chelsa_bioclims_NZ.9 0.298 -0.158 0.146
chelsa_bioclims_NZ.10 0.300 -0.143 0.132
chelsa_bioclims_NZ.11 0.313 -0.119 0.116
chelsa_bioclims_NZ.12 -0.234 -0.233 0.274
chelsa_bioclims_NZ.13 -0.216 -0.203 0.338
chelsa_bioclims_NZ.14 -0.241 -0.238 0.233
chelsa_bioclims_NZ.15 -0.119 0.211 0.496
chelsa_bioclims_NZ.16 0.176 0.346 -0.012
chelsa_bioclims_NZ.17 -0.234 -0.243 0.252
chelsa_bioclims_NZ.18 -0.171 0.256 0.192
chelsa_bioclims_NZ.19 0.116 0.151 0.289

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

#get background env't for the species
nive_bg_env <- bg_env_crop(nive_loc, 
                           species = "annulata",
                           environment = w, 
                           buffer = 0.5)

#enfa for the sexual species
nive_sexual_enfa <- enfa_calc_fun(locs = nive_loc, 
                                  species = "annulata", 
                                  reproductive_mode = "sexual", 
                                  mask_raster = nive_bg_env)

#enfa for the asexual species
nive_asexual_enfa <- enfa_calc_fun(locs = nive_loc, 
                                   species = "annulata", 
                                   reproductive_mode = "asexual", 
                                   mask_raster = nive_bg_env)


#plot the marginality scores
marginality_lollipop(sex_marg = nive_sexual_enfa$m, 
                    asex_marg = nive_asexual_enfa$m,
                    full_species_name = "Niveaphasma annulata")

###Spinotectarchus

summary.list.spin <- species_pca_fun(loc.clim, "spinotectarchus")
spin_plot <- plot_clim_pca(summary.list.spin$loc.clim, summary.list.spin$summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
spin_plot


#if selfcontained = TRUE, you can remove the folder that gets added alongside the plot. It's an annoying bug that hasn't been fixed yet.
#htmlwidgets::saveWidget(spin_plot, paste0(getwd(), "/plots/repro_mode_plots/spinotectarchus_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
spin_loc <- loc %>% 
  filter(genus == "spinotectarchus")
  
#use sourced plot_locs_leaflet script to plot localities
spin_map <- plot_locs_leaflet(spin_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
spin_map


#in case I want to save the map somewhere
#mapview::mapshot(spin_map, url = paste0(getwd(), "/plots/repro_mode_plots/spin_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/spin_map.pdf"))
summary.list.spin$summary.pca
Importance of components:
                          PC1    PC2     PC3     PC4     PC5    PC6     PC7     PC8     PC9    PC10
Standard deviation     3.2696 2.2078 1.34284 0.86560 0.74380 0.4655 0.17853 0.16747 0.12847 0.11756
Proportion of Variance 0.5626 0.2566 0.09491 0.03944 0.02912 0.0114 0.00168 0.00148 0.00087 0.00073
Cumulative Proportion  0.5626 0.8192 0.91410 0.95354 0.98265 0.9941 0.99573 0.99721 0.99808 0.99881
                          PC11    PC12    PC13    PC14    PC15    PC16    PC17    PC18    PC19
Standard deviation     0.10182 0.07402 0.05291 0.04093 0.03100 0.02372 0.02118 0.01686 0.01123
Proportion of Variance 0.00055 0.00029 0.00015 0.00009 0.00005 0.00003 0.00002 0.00001 0.00001
Cumulative Proportion  0.99935 0.99964 0.99979 0.99987 0.99993 0.99995 0.99998 0.99999 1.00000
loadings.spin <- summary.list.spin$summary.pca$rotation
knitr::kable(round(loadings.spin[,1:3],3)) #Table of loading scores for the first 3 PCs. 
PC1 PC2 PC3
chelsa_bioclims_NZ.1 -0.279 -0.110 -0.223
chelsa_bioclims_NZ.2 -0.273 -0.057 -0.289
chelsa_bioclims_NZ.3 -0.277 -0.148 -0.178
chelsa_bioclims_NZ.4 0.243 -0.262 -0.126
chelsa_bioclims_NZ.5 0.199 -0.325 -0.112
chelsa_bioclims_NZ.6 0.246 -0.230 -0.070
chelsa_bioclims_NZ.7 -0.133 -0.273 -0.032
chelsa_bioclims_NZ.8 0.209 -0.314 -0.127
chelsa_bioclims_NZ.9 0.254 -0.217 -0.106
chelsa_bioclims_NZ.10 0.231 -0.236 -0.144
chelsa_bioclims_NZ.11 0.215 -0.303 -0.135
chelsa_bioclims_NZ.12 0.199 0.273 -0.319
chelsa_bioclims_NZ.13 0.174 0.242 -0.434
chelsa_bioclims_NZ.14 0.225 0.267 -0.030
chelsa_bioclims_NZ.15 -0.165 0.138 -0.579
chelsa_bioclims_NZ.16 -0.274 -0.193 -0.055
chelsa_bioclims_NZ.17 0.217 0.281 -0.234
chelsa_bioclims_NZ.18 -0.272 -0.164 -0.178
chelsa_bioclims_NZ.19 -0.206 -0.046 -0.140

###Tectarchus

summary.list.tect <- species_pca_fun(loc.clim, "tectarchus")
tect_plot <- plot_clim_pca(summary.list.tect$loc.clim, summary.list.tect$summary.pca, factor = "reproductive_mode")
Ignoring unknown aesthetics: text
tect_plot


#if selfcontained = TRUE, you can remove the folder that gets added alongside the plot. It's an annoying bug that hasn't been fixed yet.
#htmlwidgets::saveWidget(tect_plot, paste0(getwd(), "/plots/repro_mode_plots/tectarchus_pca.html"), selfcontained = TRUE)

#filter localities for the focal genus
tect_loc <- loc %>% 
  filter(genus == "tectarchus")
  
#use sourced plot_locs_leaflet script to plot localities
tect_map <- plot_locs_leaflet(tect_loc, "reproductive_mode")
Assuming "longitude" and "latitude" are longitude and latitude, respectively
tect_map


#in case I want to save the map somewhere
#mapview::mapshot(tect_map, url = paste0(getwd(), "/plots/repro_mode_plots/tect_map.html"), file = paste0(getwd(), "/plots/repro_mode_plots/tect_map.pdf"))
summary.list.tect$summary.pca
Importance of components:
                          PC1    PC2    PC3     PC4     PC5     PC6     PC7     PC8     PC9    PC10
Standard deviation     2.8210 2.5950 1.6213 0.97360 0.59328 0.41536 0.34340 0.23982 0.11480 0.08517
Proportion of Variance 0.4188 0.3544 0.1383 0.04989 0.01853 0.00908 0.00621 0.00303 0.00069 0.00038
Cumulative Proportion  0.4188 0.7733 0.9116 0.96150 0.98002 0.98910 0.99531 0.99833 0.99903 0.99941
                          PC11    PC12    PC13    PC14    PC15    PC16    PC17    PC18    PC19
Standard deviation     0.06494 0.04977 0.03772 0.03413 0.02872 0.02484 0.01571 0.01133 0.01044
Proportion of Variance 0.00022 0.00013 0.00007 0.00006 0.00004 0.00003 0.00001 0.00001 0.00001
Cumulative Proportion  0.99963 0.99976 0.99984 0.99990 0.99994 0.99997 0.99999 0.99999 1.00000
loadings.tect <- summary.list.tect$summary.pca$rotation
knitr::kable(round(loadings.tect[,1:3],3)) #Table of loading scores for the first 3 PCs. 
PC1 PC2 PC3
chelsa_bioclims_NZ.1 0.333 0.029 -0.197
chelsa_bioclims_NZ.2 0.310 0.019 -0.288
chelsa_bioclims_NZ.3 0.345 0.030 -0.114
chelsa_bioclims_NZ.4 0.048 -0.380 0.021
chelsa_bioclims_NZ.5 0.070 -0.367 0.089
chelsa_bioclims_NZ.6 0.030 -0.379 -0.011
chelsa_bioclims_NZ.7 0.102 0.106 0.275
chelsa_bioclims_NZ.8 0.071 -0.369 0.078
chelsa_bioclims_NZ.9 0.027 -0.379 -0.010
chelsa_bioclims_NZ.10 0.018 -0.379 -0.015
chelsa_bioclims_NZ.11 0.082 -0.352 0.081
chelsa_bioclims_NZ.12 -0.279 -0.060 -0.352
chelsa_bioclims_NZ.13 -0.252 -0.058 -0.362
chelsa_bioclims_NZ.14 -0.300 -0.045 -0.285
chelsa_bioclims_NZ.15 0.215 -0.011 -0.481
chelsa_bioclims_NZ.16 0.351 0.042 -0.021
chelsa_bioclims_NZ.17 -0.285 -0.062 -0.343
chelsa_bioclims_NZ.18 0.273 0.008 -0.209
chelsa_bioclims_NZ.19 0.293 0.046 -0.197

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

This is for Tectarchus ovobessus.

#get background env't for the species
tect_bg_env <- bg_env_crop(tect_loc, 
                           species = "ovobessus",
                           environment = w, 
                           buffer = 0.5)

#enfa for the sexual species
tect_sexual_enfa <- enfa_calc_fun(locs = tect_loc, 
                                  species = "ovobessus", 
                                  reproductive_mode = "sexual", 
                                  mask_raster = tect_bg_env)

#enfa for the asexual species
tect_asexual_enfa <- enfa_calc_fun(locs = tect_loc, 
                                   species = "ovobessus", 
                                   reproductive_mode = "asexual", 
                                   mask_raster = tect_bg_env)


#plot the marginality scores
marginality_lollipop(sex_marg = tect_sexual_enfa$m, 
                    asex_marg = tect_asexual_enfa$m,
                    full_species_name = "Tectarchus ovobessus")

This is an enfa for Tectarchus huttoni.

#get background env't for the species
tect_bg_env <- bg_env_crop(tect_loc, 
                           species = "huttoni",
                           environment = w, 
                           buffer = 0.5)

#enfa for the sexual species
tect_sexual_enfa <- enfa_calc_fun(locs = tect_loc, 
                                  species = "huttoni", 
                                  reproductive_mode = "sexual", 
                                  mask_raster = tect_bg_env)

#enfa for the asexual species
tect_asexual_enfa <- enfa_calc_fun(locs = tect_loc, 
                                   species = "huttoni", 
                                   reproductive_mode = "asexual", 
                                   mask_raster = tect_bg_env)


#plot the marginality scores
marginality_lollipop(sex_marg = tect_sexual_enfa$m, 
                    asex_marg = tect_asexual_enfa$m,
                    full_species_name = "Tectarchus huttoni")

###Tepakiphasma Nothing. Only one locality.

LS0tCnRpdGxlOiAiU3RpY2sgSW5zZWN0IENsaW1hdGUgUENBIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHRhbmdvCi0tLQoKUmVhZCBpbiB0aGUgcGFja2FnZXMuIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyB3aGVyZXZlciB0aGUgUiBOb3RlYm9vayBpcyBsb2NhdGVkLiAKCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0KcGFja2FnZXMgPC0gYygicmFzdGVyIiwgImRhdGEudGFibGUiLCAidGlkeXZlcnNlIiwgInNmIiwgIlJTdG9vbGJveCIsICJsZWFmbGV0IiwgInBsb3RseSIsICJnZGF0YSIsICJCU0RBIiwgImFkZTQiLCAicmVhZHhsIiwgImphbml0b3IiLCAicm5hdHVyYWxlYXJ0aCIsICJhZGVoYWJpdGF0SFMiKSAjUlN0b29sYm94IGhhcyBzb21lIGRlcGVuZGVuY2llcyBsaWtlIG9wZW5NUCB0aGF0IGNhbiBiZSBkaWZmaWN1bHQgdG8gY29tcGlsZSBvbiBhIE1hYyAobmVlZGVkIGZvciB0aGUgZGVwZW5kZW50IHBhY2thZ2UgImNhcmV0IikuIElmIHlvdSBoYXZlIEhpZ2ggU2llcnJhIE9TIG9yIG5ld2VyLCBzZWFyY2ggZm9yIGluc3RydWN0aW9ucyBzcGVjaWZpYyB0byB5b3VyIE9TLSBpdCdzIGEgbG90IGVhc2llciB0aGFuIG9sZGVyIE9TJ3MuCmxhcHBseShwYWNrYWdlcywgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQpzb3VyY2UoIlIvcGxvdF9sZWFmbGV0X2Z1bmN0aW9uLlIiKSAjc291cmNlIGxvY2FsaXR5IHBsb3R0aW5nIGZ1bmN0aW9uCnNvdXJjZSgiUi9wbG90X2NsaW1hdGVfcGNhX2Z1bmN0aW9uLlIiKSAjc291cmNlIHBjYSBwbG90dGluZyBmdW5jdGlvbgpzb3VyY2UoIlIvc3BlY2llc19wY2FfZnVuY3Rpb24uUiIpICNzb3VyY2UgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBjbGltYXRlIHBjYSBwZXIgc3BlY2llcwpzb3VyY2UoIlIvbWluX2NvbnZleF9wb2x5LlIiKSAjc291cmNlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG1pbmltdW0gY29udmV4IHBvbHlnb24gYXJvdW5kIHBvaW50cwpzb3VyY2UoIlIvZW5mYV9jYWxjX2Z1bmN0aW9uLlIiKQpzb3VyY2UoIlIvbWFyZ2luYWxpdHlfbG9sbGlwb3BfcGxvdC5SIikKc291cmNlKCJSL3ByZXNlbmNlX2Fic2VuY2VfcmFzdGVyX2Z1bmN0aW9uLlIiKQpzb3VyY2UoIlIvY3JvcF9iYWNrZ3JvdW5kX2Vudl9mdW5jdGlvbi5SIikKYGBgCgoKUmVhZCBpbiB0aGUgc3ByZWFkc2hlZXQgYW5kIHRha2UgYSBsb29rIGF0IHRoZSBkYXRhLgoKYGBge3J9CiMjI3JlYWQgaW4gc3ByZWFkc2hlZXQKbG9jIDwtIHJlYWRfeGxzeCgiT3JpZ2luYWwtc3ByZWFkc2hlZXRzL2FsbCBzcGVjaWVzIE5ld182LTE0LTE5Lnhsc3giKSAlPiUgCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gYXMuZmFjdG9yKHJlcHJvZHVjdGl2ZV9tb2RlKSkgCgojZ2V0IHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMsIGFuZCB0aGUgc2V4dWFsaXR5IGNvdW50cyBwZXIgc3BlY2llcwpjb3VudF9yZXByb19tb2RlIDwtIGxvYyAlPiUgCiAgZ3JvdXBfYnkoZ2VudXMsIHNwZWNpZXMsIHJlcHJvZHVjdGl2ZV9tb2RlKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgbXV0YXRlKGdlbnVzX3NwZWNpZXMgPSBzdHJfYyhnZW51cywgc3BlY2llcywgc2VwID0gIl8iKSwKICAgICAgICAgZ2VudXNfc3BlY2llcyA9IHN0cl9yZXBsYWNlX2FsbChnZW51c19zcGVjaWVzLCAiICIsICJfIiksCiAgICAgICAgIGdlbnVzX3NwZWNpZXMgPSBzdHJfcmVwbGFjZV9hbGwoZ2VudXNfc3BlY2llcywgIlxcLiIsICIiKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKGdlbnVzX3NwZWNpZXMgPSBmY3RfcmVvcmRlcihnZW51c19zcGVjaWVzLCBuLCBzdW0pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ2VudXNfc3BlY2llcywgeSA9IG4sIGZpbGwgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2NvbCgpICsKICBjb29yZF9mbGlwKCkgKyAKICB0aGVtZV9taW5pbWFsKCkKCmNvdW50X3JlcHJvX21vZGUKYGBgCgojI01hcApQbG90IGEgbGVhZmxldCBtYXAgb2YgdGhlIGxvY2FsaXRpZXMuIFRoZSBsZWFmbGV0IG1hcCBpcyBpbnRlcmFjdGl2ZS4gWW91IGNhbiBjbGljayBvbiB0aGUgbG9jYWxpdGllcyBhbmQgYSBmbGFnIHdpdGggc29tZSBtZXRhZGF0YSB3aWxsIHBvcCB1cCEgCgpgYGB7cn0KI21ha2UgbG9jYWxpdHkgc2hhcGUgZmlsZSBhbmQgYXNzaWduIFdHUyBjb29yZCBzeXN0ZW0KY29vcmRfcG9pbnRzIDwtIHN0X2FzX3NmKGxvYywgY29vcmRzID0gYygibG9uZ2l0dWRlIiwgImxhdGl0dWRlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgY3JzID0gNDMyNiwgYWdyID0gImNvbnN0YW50IikKCiN1c2Ugc291cmNlZCBwbG90X2xvY3NfbGVhZmxldCBzY3JpcHQgdG8gcGxvdCBsb2NhbGl0aWVzCmFsbF9wbG90IDwtIHBsb3RfbG9jc19sZWFmbGV0KGxvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCmFsbF9wbG90CiNpbiBjYXNlIEkgd2FudCB0byBzYXZlIHRoZSBtYXAgc29tZXdoZXJlCiNtYXB2aWV3OjptYXBzaG90KGFsbF9wbG90LCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FsbF9zcGVjaWVzX21hcC5odG1sIiksIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FsbF9zcGVjaWVzX21hcC5wZGYiKSkKYGBgCgojI1BDQS1HZW5lcmEgey50YWJzZXR9CgojIyNDbGltYXRlIERhdGEKT2J0YWluIHRoZSBiaW9jbGltIGxheWVycyBmb3IgYW5hbHlzaXMuIEknbSB1c2luZyBhbGwgMTkgZm9yIHRoaXMgcHJlbGltaW5hcnkgZXhwbG9yYXRpb24uIEkgcGxvdHRlZCB0aGUgZmlyc3QgYmlvY2xpbSBqdXN0IHRvIG1ha2Ugc3VyZSBub3RoaW5nIHNlZW1zIHdvbmt5LiBJJ20gdXNpbmcgQ0hFTFNBIGRhdGEgZG93bmxvYWRlZCBmcm9tIHRoZWlyIHdlYnNpdGUuIFNpbmNlIHRoZSBmaWxlcyBhcmUgaHVnZSwgSSBvbmx5IHVuemlwIHRoZW0gb25lIGF0IGEgdGltZSwgY3JvcCB0aGVtLCBhbmQgd3JpdGUgdGhlbSB0byBHZW9UaWZmIGZpbGVzIHRoYXQgSSBjYW4gdGhlbiBsb2FkIGluIGFzIGEgcmFzdGVyc3RhY2suCmBgYHtyfQojI2dldCBjaGVsc2EgZGF0YQojY2hlbHNhX2ZvbGRlciA8LSAiL1VzZXJzL2Nvbm5vcmZyZW5jaC9Ecm9wYm94L09sZF9NYWMvY2xpbWF0ZS1kYXRhL2NoZWxzYV8zMHNfYmlvIgojemlwX2ZpbGVzIDwtIGxpc3QuZmlsZXMoY2hlbHNhX2ZvbGRlciwgZnVsbC5uYW1lcyA9IFRSVUUpCgojdXNpbmcgdGhlIFVuYXJjaGl2ZXIgY29tbWFuZGxpbmUgdG9vbHMgZm9yIE1hYyB0byB1bnppcCB0aGUgN3ppcCBjaGVsc2EgbGF5ZXJzLiBSZWd1bGFyIHVuemlwKCkgZG9lcyBub3Qgd29yayB3aXRoIDd6IHppcHBlZCBmaWxlcwojZm9yIChmaWxlIGluIHppcF9maWxlcykgewogICNzZXQgdGVtcCBkaXJlY3RvcnkKIyAgdGVtcGQgPC0gdGVtcGRpcigpCiMgIHN5c3RlbShwYXN0ZSgidW5hciIsIGZpbGUsICItbyIsIHRlbXBkKSkKIyAgciA8LSByYXN0ZXIobGlzdC5maWxlcyh0ZW1wZCwgcGF0dGVybiA9ICIqLnRpZiIsIGZ1bGwubmFtZXMgPSBUUlVFKSkgJT4lCiMgICAgY3JvcChleHRlbnQoMTY2LCAxNzksIC00OCwgLTM0KSkKIyAgd3JpdGVSYXN0ZXIociwgZmlsZW5hbWUgPSBwYXN0ZTAoIn4vRGVza3RvcC8iLCBsaXN0LmZpbGVzKHRlbXBkLCBwYXR0ZXJuID0gIioudGlmIikpLCBmb3JtYXQgPSAiR1RpZmYiKQojICB1bmxpbmsodGVtcGQsIHJlY3Vyc2l2ZSA9IFRSVUUpCiN9CgpjbGltX2ZpbGVzIDwtICIvVXNlcnMvY29ubm9yZnJlbmNoL0Ryb3Bib3gvT2xkX01hYy9jbGltYXRlLWRhdGEvY2hlbHNhXzMwc2VjX05ld1plYWxhbmQvY2hlbHNhX2Jpb2NsaW1zX05aLnRpZiIKdyA8LSBzdGFjayhjbGltX2ZpbGVzKQoKCmBgYAoKCiMjI1BDQSBieSBsb2NhbGl0eQpUaGlzIGlzIGEgUENBIG9mIHRoZSBjbGltYXRlIGRhdGEgZXh0cmFjdGVkIGZvciBlYWNoIGxvY2FsaXR5LCByYXRoZXIgdGhhbiBhIFBDQSBvZiB0aGUgdG90YWwgY2xpbWF0ZSBzcGFjZS4KClJ1biB0aGUgcGNhIGFuZCBjaGVjayBvdXQgdmFyaWFibGUgbG9hZGluZ3MgYW5kIHByb3BvcnRpb24gb2YgdmFyaWFuY2UgZXhwbGFpbmVkIGJ5IGNvbXBvbmVudHMuCgpgYGB7cn0KI2V4dHJhY3QgZGF0YSBmcm9tIHdvcmxkY2xpbSBmb3IgZWFjaCBsb2NhbGl0eS4gTWFraW5nIHRoaXMgaW50byBhIGRhdGEgZnJhbWUgd2l0aCBjb2x1bW5zIGxhYmVsZWQgc28gdGhlIHJvdyBsYWJlbGluZyBsaW5lcyB1cCBhZnRlciBJIHJlbW92ZSB0aGUgTkFzLgojZXh0cmFjdCBkYXRhIGZyb20gd29ybGRjbGltIGZvciBlYWNoIGxvY2FsaXR5Lgpjb29yZHMgPC0gZGF0YS5mcmFtZShsYXRpdHVkZSA9IGxvYyRsb25naXR1ZGUsIGxvbmdpdHVkZSA9IGxvYyRsYXRpdHVkZSkKCmxvYy5jbGltIDwtIGRwbHlyOjpiaW5kX2NvbHMobG9jLCByYXN0ZXI6OmV4dHJhY3QodywgY29vcmRzLCBtZXRob2QgPSAic2ltcGxlIiwgZGYgPSBUUlVFKSkgJT4lIAogIGRyb3BfbmEoY2hlbHNhX2Jpb2NsaW1zX05aLjEpICU+JSAKICBkcGx5cjo6c2VsZWN0KC1JRCkKCiNtYWtlIGEgbWF0cml4IG9mIG9ubHkgYmlvY2xpbSB2YWx1ZXMKY2xpbS5tYXQgPC0gbG9jLmNsaW1bLGdyZXAoImJpbyIsIG5hbWVzKGxvYy5jbGltKSldICU+JSBhcy5tYXRyaXgoKQoKI3J1biBwY2Egb24gY2xpbWF0ZSB2YXJpYWJsZXMKY2xpbS5wY2EgPC0gcHJjb21wKGNsaW0ubWF0LCBzY2FsZSA9IFRSVUUpCnN1bW1hcnkucGNhIDwtIHN1bW1hcnkoY2xpbS5wY2EpICNjaGVjayBvdXQgdGhlIGNvbXBvbmVudHMKCiNwbG90IHRhYmxlcwpzdW1tYXJ5LnBjYQprbml0cjo6a2FibGUocm91bmQoY2xpbS5wY2Ekcm90YXRpb25bLDE6M10sMykpICNUYWJsZSBvZiBsb2FkaW5nIHNjb3JlcyBmb3IgdGhlIGZpcnN0IDMgUENzLgpgYGAKClR3byBwbG90czogT25lIHBsb3Qgb2YgdGhlIFBDQSBjb2xvcmVkIGFjY29yZGluZyB0byBnZW51cywgd2l0aCBjb252ZXggaHVsbHMgc3Vycm91bmRpbmcgdGhlIGdlbmVyYS4gSXQgbG9va3MgbGlrZSB0aGlzIHJlZmxlY3RzIGEgbGF0aXR1ZGluYWwgZ3JhZGllbnQgaW4gdGVtcGVyYXR1cmUhIFlvdSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgUENBIHBsb3QgYnkgY2xpY2tpbmcgb24gcG9pbnRzIHRvIHZpZXcgYXNzb2NpYXRlZCBtZXRhZGF0YS4gWW91IGNhbiBpc29sYXRlIHRoZSBnZW51cyB5b3Ugd2FudCB0byB2aWV3IGJ5IGRvdWJsZSBjbGlja2luZyB0aGUgZ2VudXMgaW4gdGhlIGxlZ2VuZCEgWW91IGNhbiBhbHNvIHJlbW92ZSBhIGdlbnVzIGJ5IGNsaWNraW5nIG9uIGl0IG9uY2UuIFRoZXJlJ3Mgc29tZSBvdGhlciBmdW5jdGlvbmFsaXR5IHlvdSBjYW4gZXhwbG9yZSBpbiB0aGUgdG9vbGJhciBhdCB0aGUgdG9wIG9mIHRoZSBwbG90LiBUaGUgc2Vjb25kIHBsb3QgaXMgYSBQQ0EgY29sb3JlZCBhY2NvcmRpbmcgdG8gcmVwcm9kdWN0aXZlIG1vZGUuIEl0IGxvb2tzIGxpa2UgYXNleHVhbCBwb3B1bGF0aW9ucyBvY2N1cHkgc2xpZ2h0bHkgbGFyZ2VyIG5pY2hlIHNwYWNlLCBidXQgYm90aCByZXByb2R1Y3RpdmUgbW9kZXMgaGF2ZSBhIHNpbWlsYXIgbmljaGUgY2VudGVyLgpgYGB7cn0KCiNhZGQgcGNhIHJlc3VsdHMgdG8gbG9jLmNsaW0gZGF0YSBmcmFtZQpsb2MuY2xpbSA8LSBkYXRhLmZyYW1lKGxvYy5jbGltLCBjbGltLnBjYSR4KQoKI3VzZSBzb3VyY2VkIHBsb3RfY2xpbV9wY2EgZnVuY3Rpb24gdG8gcGxvdCB0aGUgcGNhIHJlc3VsdHMuIGFyZ3MgYXJlIHRoZSBkYXRhIHNldCB3aXRoIHNwZWNpZXMgbmFtZXMgYW5kIFBDIGF4aXMgdmFsdWVzIGFuZCB0aGUgcGNhIHN1bW1hcnkKYWxsX3BjYSA8LSBwbG90X2NsaW1fcGNhKGxvYy5jbGltLCBzdW1tYXJ5LnBjYSwgZmFjdG9yID0gImdlbnVzIikKYWxsX3BjYQoKI3VzZSBzb3VyY2VkIHBsb3RfY2xpbV9wY2EgZnVuY3Rpb24gdG8gcGxvdCB0aGUgcGNhIHJlc3VsdHMuIGFyZ3MgYXJlIHRoZSBkYXRhIHNldCB3aXRoIHNwZWNpZXMgbmFtZXMgYW5kIFBDIGF4aXMgdmFsdWVzIGFuZCB0aGUgcGNhIHN1bW1hcnkKcmVwcm9fcGNhIDwtIHBsb3RfY2xpbV9wY2EobG9jLmNsaW0sIHN1bW1hcnkucGNhLCBmYWN0b3IgPSAicmVwcm9kdWN0aXZlX21vZGUiKQpyZXByb19wY2EKCiNzYXZlIHRoZSBwbG90IGNvbG9yZWQgYnkgZ2VudXMKI2h0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KGFsbF9wY2EsIHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvYWxsX3NwZWNpZXNfcGNhX2dlbnVzLmh0bWwiKSwgc2VsZmNvbnRhaW5lZCA9IFRSVUUpCgojc2F2ZSB0aGUgcGxvdCBjb2xvcmVkIGJ5IHJlcHJvZHVjdGl2ZSBtb2RlCiNodG1sd2lkZ2V0czo6c2F2ZVdpZGdldChyZXByb19wY2EsIHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvYWxsX3NwZWNpZXNfcGNhX3JlcHJvLmh0bWwiKSwgc2VsZmNvbnRhaW5lZCA9IFRSVUUpCgoKCmBgYAoKCgoKCgoKIyNQQ0EtU3BlY2llcyB7LnRhYnNldH0KVGhlc2UgYXJlIFBDQXMgb2YgZW52aXJvbm1lbnRhbCBzcGFjZSBmb3Igc3BlY2llcyB3aXRoaW4gZ2VuZXJhLiBFYWNoIGNsaW1hdGUgUENBIGlzIG9mIGxvY2FsaXRpZXMgZm9yIGEgc2luZ2xlIGdlbnVzLCBjb2xvcmVkIGJ5IHNwZWNpZXMuIEknbSBkb2luZyB0aGlzIGV2ZW4gZm9yIGdlbmVyYSB3aXRoIG9uZSBzcGVjaWVzLCBzbyBpdCdzIGVhc3kgdG8gc2VlIGlmIGNlcnRhaW4gbG9jYWxpdGllcyBncm91cCB0b2dldGhlci4gCgojIyNBY2FudGhveHlsYQpgYGB7cn0KI3NvdXJjZSBmdW5jdGlvbiB0byBjb25kdWN0IGEgUENBIG9uIGluZGl2aWR1YWwgc3BlY2llcwpzdW1tYXJ5Lmxpc3QuYWNhbiA8LSBzcGVjaWVzX3BjYV9mdW4obG9jLmNsaW0sICJhY2FudGhveHlsYSIpCiNwbG90CmFjYW5fcGxvdCA8LSBwbG90X2NsaW1fcGNhKHN1bW1hcnkubGlzdC5hY2FuJGxvYy5jbGltLCBzdW1tYXJ5Lmxpc3QuYWNhbiRzdW1tYXJ5LnBjYSwgInJlcHJvZHVjdGl2ZV9tb2RlIikKCmFjYW5fcGxvdAoKI3NhdmUgcGNhIHBsb3QKI2h0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KGFjYW5fcGxvdCwgcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9hY2FudGhveHlsYV9wY2EuaHRtbCIpLCBzZWxmY29udGFpbmVkID0gVFJVRSkKCiNmaWx0ZXIgbG9jYWxpdGllcyBmb3IgdGhlIGZvY2FsIGdlbnVzCmFjYW5fbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJhY2FudGhveHlsYSIpCiAgCiN1c2Ugc291cmNlZCBwbG90X2xvY3NfbGVhZmxldCBzY3JpcHQgdG8gcGxvdCBsb2NhbGl0aWVzCmFjYW5fbWFwIDwtIHBsb3RfbG9jc19sZWFmbGV0KGFjYW5fbG9jLCAicmVwcm9kdWN0aXZlX21vZGUiKQoKYWNhbl9tYXAKCiNpbiBjYXNlIEkgd2FudCB0byBzYXZlIHRoZSBtYXAgc29tZXdoZXJlCiNtYXB2aWV3OjptYXBzaG90KGFjYW5fbWFwLCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FjYW5fbWFwLmh0bWwiKSwgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvYWNhbl9tYXAucGRmIikpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5Lmxpc3QuYWNhbiRzdW1tYXJ5LnBjYQpsb2FkaW5ncy5hY2FuIDwtIHN1bW1hcnkubGlzdC5hY2FuJHN1bW1hcnkucGNhJHJvdGF0aW9uCmtuaXRyOjprYWJsZShyb3VuZChsb2FkaW5ncy5hY2FuWywxOjNdLDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKCiMjI0FyZ29zYXJjaHVzCmBgYHtyfQojY29uZHVjdCBwY2EKc3VtbWFyeS5saXN0LmFyZ28gPC0gc3BlY2llc19wY2FfZnVuKGxvYy5jbGltLCAiYXJnb3NhcmNodXMiKQojcGxvdAphcmdvX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5Lmxpc3QuYXJnbyRsb2MuY2xpbSwgc3VtbWFyeS5saXN0LmFyZ28kc3VtbWFyeS5wY2EsIGZhY3RvciA9ICJyZXByb2R1Y3RpdmVfbW9kZSIpCmFyZ29fcGxvdAoKI2lmIHNlbGZjb250YWluZWQgPSBUUlVFLCB5b3UgY2FuIHJlbW92ZSB0aGUgZm9sZGVyIHRoYXQgZ2V0cyBhZGRlZCBhbG9uZ3NpZGUgdGhlIHBsb3QuIEl0J3MgYW4gYW5ub3lpbmcgYnVnIHRoYXQgaGFzbid0IGJlZW4gZml4ZWQgeWV0LgojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXJnb19wbG90LCBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FyZ29zYXJjaHVzX3BjYS5odG1sIiksIHNlbGZjb250YWluZWQgPSBUUlVFKQoKI2ZpbHRlciBsb2NhbGl0aWVzIGZvciB0aGUgZm9jYWwgZ2VudXMKYXJnb19sb2MgPC0gbG9jICU+JSAKICBmaWx0ZXIoZ2VudXMgPT0gImFyZ29zYXJjaHVzIikKICAKI3VzZSBzb3VyY2VkIHBsb3RfbG9jc19sZWFmbGV0IHNjcmlwdCB0byBwbG90IGxvY2FsaXRpZXMKYXJnb19tYXAgPC0gcGxvdF9sb2NzX2xlYWZsZXQoYXJnb19sb2MsICJyZXByb2R1Y3RpdmVfbW9kZSIpCgphcmdvX21hcAoKI2luIGNhc2UgSSB3YW50IHRvIHNhdmUgdGhlIG1hcCBzb21ld2hlcmUKI21hcHZpZXc6Om1hcHNob3QoYXJnb19tYXAsIHVybCA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvYXJnb19tYXAuaHRtbCIpLCBmaWxlID0gcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9hcmdvX21hcC5wZGYiKSkKCgpgYGAKCmBgYHtyfQpzdW1tYXJ5Lmxpc3QuYXJnbyRzdW1tYXJ5LnBjYQpsb2FkaW5ncy5hcmdvIDwtIHN1bW1hcnkubGlzdC5hcmdvJHN1bW1hcnkucGNhJHJvdGF0aW9uCmtuaXRyOjprYWJsZShyb3VuZChsb2FkaW5ncy5hcmdvWywxOjNdLDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKTm93IEknbSBnb2luZyB0byB0byBlbnZpcm9ubWVudGFsIG5pY2hlIGZhY3RvciBhbmFseXNpcyBiZXR3ZWVuIHNleHVhbCBhbmQgYXNleHVhbCBwb3B1bGF0aW9ucyB3aXRoaW4gdGhlIHNwZWNpZXMuCmBgYHtyfQoKI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwphaG9yX2JnX2VudiA8LSBiZ19lbnZfY3JvcChhcmdvX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaG9ycmlkdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAwLjUpCgojZW5mYSBmb3IgdGhlIHNleHVhbCBzcGVjaWVzCmFob3Jfc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gYXJnb19sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJob3JyaWR1cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IGFob3JfYmdfZW52KQoKI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXMKYWhvcl9hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gYXJnb19sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaG9ycmlkdXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBhaG9yX2JnX2VudikKCgojcGxvdCB0aGUgbWFyZ2luYWxpdHkgc2NvcmVzCm1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gYWhvcl9zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSBhaG9yX2FzZXh1YWxfZW5mYSRtLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIkFyZ29zYXJjaHVzIGhvcnJpZHVzIikKCgoKYGBgCgoKCgojIyNBc3RlbGlhcGhhc21hCmBgYHtyfQojcGNhCnN1bW1hcnkubGlzdC5hc3RlIDwtIHNwZWNpZXNfcGNhX2Z1bihsb2MuY2xpbSwgImFzdGVsaWFwaGFzbWEiKQojcGxvdAphc3RlX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5Lmxpc3QuYXN0ZSRsb2MuY2xpbSwgc3VtbWFyeS5saXN0LmFzdGUkc3VtbWFyeS5wY2EsIGZhY3RvciA9ICJyZXByb2R1Y3RpdmVfbW9kZSIpCmFzdGVfcGxvdAoKI2lmIHNlbGZjb250YWluZWQgPSBUUlVFLCB5b3UgY2FuIHJlbW92ZSB0aGUgZm9sZGVyIHRoYXQgZ2V0cyBhZGRlZCBhbG9uZ3NpZGUgdGhlIHBsb3QuIEl0J3MgYW4gYW5ub3lpbmcgYnVnIHRoYXQgaGFzbid0IGJlZW4gZml4ZWQgeWV0LgojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXN0ZV9wbG90LCBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FzdGVsaWFwaGFzbWFfcGNhLmh0bWwiKSwgc2VsZmNvbnRhaW5lZCA9IFRSVUUpCgojZmlsdGVyIGxvY2FsaXRpZXMgZm9yIHRoZSBmb2NhbCBnZW51cwphc3RlX2xvYyA8LSBsb2MgJT4lIAogIGZpbHRlcihnZW51cyA9PSAiYXN0ZWxpYXBoYXNtYSIpCiAgCiN1c2Ugc291cmNlZCBwbG90X2xvY3NfbGVhZmxldCBzY3JpcHQgdG8gcGxvdCBsb2NhbGl0aWVzCmFzdGVfbWFwIDwtIHBsb3RfbG9jc19sZWFmbGV0KGFzdGVfbG9jLCAicmVwcm9kdWN0aXZlX21vZGUiKQoKYXN0ZV9tYXAKCiNpbiBjYXNlIEkgd2FudCB0byBzYXZlIHRoZSBtYXAgc29tZXdoZXJlCiNtYXB2aWV3OjptYXBzaG90KGFzdGVfbWFwLCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FzdGVfbWFwLmh0bWwiKSwgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvYXN0ZV9tYXAucGRmIikpCgpgYGAKCgoKYGBge3J9CnN1bW1hcnkubGlzdC5hc3RlJHN1bW1hcnkucGNhCmxvYWRpbmdzLmFzdGUgPC0gc3VtbWFyeS5saXN0LmFzdGUkc3VtbWFyeS5wY2Ekcm90YXRpb24Ka25pdHI6OmthYmxlKHJvdW5kKGxvYWRpbmdzLmFzdGVbLDE6M10sMykpICNUYWJsZSBvZiBsb2FkaW5nIHNjb3JlcyBmb3IgdGhlIGZpcnN0IDMgUENzLiAKYGBgCgoKCk5vdyBJJ20gZ29pbmcgdG8gdG8gZW52aXJvbm1lbnRhbCBuaWNoZSBmYWN0b3IgYW5hbHlzaXMgYmV0d2VlbiBzZXh1YWwgYW5kIGFzZXh1YWwgcG9wdWxhdGlvbnMgd2l0aGluIHRoZSBzcGVjaWVzLgpgYGB7cn0KI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwphanVjX2JnX2VudiA8LSBiZ19lbnZfY3JvcChhc3RlX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAianVjdW5kdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAwLjUpCgojZW5mYSBmb3IgdGhlIHNleHVhbCBzcGVjaWVzCmFqdWNfc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gYXN0ZV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJqdWN1bmR1bSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IGFqdWNfYmdfZW52KQoKI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXMKYWp1Y19hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gYXN0ZV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAianVjdW5kdW0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBhanVjX2JnX2VudikKCgojcGxvdCB0aGUgbWFyZ2luYWxpdHkgc2NvcmVzCm1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gYWp1Y19zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSBhanVjX2FzZXh1YWxfZW5mYSRtLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIkFzdGVsaWFwaGFzbWEganVjdW5kdW0iKQoKYGBgCgoKIyMjQ2xpdGFyY2h1cwoKYGBge3J9CnN1bW1hcnkubGlzdC5jbGl0YSA8LSBzcGVjaWVzX3BjYV9mdW4obG9jLmNsaW0sICJjbGl0YXJjaHVzIikKY2xpdGFfcGxvdCA8LSBwbG90X2NsaW1fcGNhKHN1bW1hcnkubGlzdC5jbGl0YSRsb2MuY2xpbSwgc3VtbWFyeS5saXN0LmNsaXRhJHN1bW1hcnkucGNhLCBmYWN0b3IgPSAicmVwcm9kdWN0aXZlX21vZGUiKQpjbGl0YV9wbG90CgojaWYgc2VsZmNvbnRhaW5lZCA9IFRSVUUsIHlvdSBjYW4gcmVtb3ZlIHRoZSBmb2xkZXIgdGhhdCBnZXRzIGFkZGVkIGFsb25nc2lkZSB0aGUgcGxvdC4gSXQncyBhbiBhbm5veWluZyBidWcgdGhhdCBoYXNuJ3QgYmVlbiBmaXhlZCB5ZXQuCiNodG1sd2lkZ2V0czo6c2F2ZVdpZGdldChjbGl0YV9wbG90LCBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2NsaXRhcmNodXNfcGNhLmh0bWwiKSwgc2VsZmNvbnRhaW5lZCA9IFRSVUUpCgojZmlsdGVyIGxvY2FsaXRpZXMgZm9yIHRoZSBmb2NhbCBnZW51cwpjbGl0YV9sb2MgPC0gbG9jICU+JSAKICBmaWx0ZXIoZ2VudXMgPT0gImNsaXRhcmNodXMiKQogIAojdXNlIHNvdXJjZWQgcGxvdF9sb2NzX2xlYWZsZXQgc2NyaXB0IHRvIHBsb3QgbG9jYWxpdGllcwpjbGl0YV9tYXAgPC0gcGxvdF9sb2NzX2xlYWZsZXQoY2xpdGFfbG9jLCAicmVwcm9kdWN0aXZlX21vZGUiKQoKY2xpdGFfbWFwCgojaW4gY2FzZSBJIHdhbnQgdG8gc2F2ZSB0aGUgbWFwIHNvbWV3aGVyZQojbWFwdmlldzo6bWFwc2hvdChjbGl0YV9tYXAsIHVybCA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvY2xpdGFfbWFwLmh0bWwiKSwgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvY2xpdGFfbWFwLnBkZiIpKQoKYGBgCgoKYGBge3J9CnN1bW1hcnkubGlzdC5jbGl0YSRzdW1tYXJ5LnBjYQpsb2FkaW5ncy5jbGl0YSA8LSBzdW1tYXJ5Lmxpc3QuY2xpdGEkc3VtbWFyeS5wY2Ekcm90YXRpb24Ka25pdHI6OmthYmxlKHJvdW5kKGxvYWRpbmdzLmNsaXRhWywxOjNdLDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKCk5vdyBJJ20gZ29pbmcgdG8gdG8gZW52aXJvbm1lbnRhbCBuaWNoZSBmYWN0b3IgYW5hbHlzaXMgYmV0d2VlbiBzZXh1YWwgYW5kIGFzZXh1YWwgcG9wdWxhdGlvbnMgd2l0aGluIHRoZSBzcGVjaWVzLgpgYGB7cn0KI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwpjaG9vX2JnX2VudiA8LSBiZ19lbnZfY3JvcChjbGl0YV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImhvb2tlcmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAwLjUpCgojZW5mYSBmb3IgdGhlIHNleHVhbCBzcGVjaWVzCmNob29fc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gY2xpdGFfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaG9va2VyaSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IGNob29fYmdfZW52KQoKI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXMKY2hvb19hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gY2xpdGFfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImhvb2tlcmkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBjaG9vX2JnX2VudikKCgojcGxvdCB0aGUgbWFyZ2luYWxpdHkgc2NvcmVzCm1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gY2hvb19zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSBjaG9vX2FzZXh1YWxfZW5mYSRtLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIkNsaXRhcmNodXMgaG9va2VyaSIpCgpgYGAKCgojIyNNaWNyYXJjaHVzCmBgYHtyfQpzdW1tYXJ5Lmxpc3QubWljcmEgPC0gc3BlY2llc19wY2FfZnVuKGxvYy5jbGltLCAibWljcmFyY2h1cyIpCm1pY3JhX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5Lmxpc3QubWljcmEkbG9jLmNsaW0sIHN1bW1hcnkubGlzdC5taWNyYSRzdW1tYXJ5LnBjYSwgZmFjdG9yID0gInJlcHJvZHVjdGl2ZV9tb2RlIikKbWljcmFfcGxvdAoKI2lmIHNlbGZjb250YWluZWQgPSBUUlVFLCB5b3UgY2FuIHJlbW92ZSB0aGUgZm9sZGVyIHRoYXQgZ2V0cyBhZGRlZCBhbG9uZ3NpZGUgdGhlIHBsb3QuIEl0J3MgYW4gYW5ub3lpbmcgYnVnIHRoYXQgaGFzbid0IGJlZW4gZml4ZWQgeWV0LgojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQobWljcmFfcGxvdCwgcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9taWNyYXJjaHVzX3BjYS5odG1sIiksIHNlbGZjb250YWluZWQgPSBUUlVFKQoKI2ZpbHRlciBsb2NhbGl0aWVzIGZvciB0aGUgZm9jYWwgZ2VudXMKbWljcmFfbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJtaWNyYXJjaHVzIikKICAKI3VzZSBzb3VyY2VkIHBsb3RfbG9jc19sZWFmbGV0IHNjcmlwdCB0byBwbG90IGxvY2FsaXRpZXMKbWljcmFfbWFwIDwtIHBsb3RfbG9jc19sZWFmbGV0KG1pY3JhX2xvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCm1pY3JhX21hcAoKI2luIGNhc2UgSSB3YW50IHRvIHNhdmUgdGhlIG1hcCBzb21ld2hlcmUKbWFwdmlldzo6bWFwc2hvdChtaWNyYV9tYXAsIHVybCA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvbWljcmFfbWFwLmh0bWwiKSwgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvbWljcmFfbWFwLnBkZiIpKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeS5saXN0Lm1pY3JhJHN1bW1hcnkucGNhCmxvYWRpbmdzLm1pY3JhIDwtIHN1bW1hcnkubGlzdC5taWNyYSRzdW1tYXJ5LnBjYSRyb3RhdGlvbgprbml0cjo6a2FibGUocm91bmQobG9hZGluZ3MubWljcmFbLDE6M10sMykpICNUYWJsZSBvZiBsb2FkaW5nIHNjb3JlcyBmb3IgdGhlIGZpcnN0IDMgUENzLiAKYGBgCgojIyNOaXZlYXBoYXNtYQoKYGBge3J9CnN1bW1hcnkubGlzdC5uaXZlIDwtIHNwZWNpZXNfcGNhX2Z1bihsb2MuY2xpbSwgIm5pdmVhcGhhc21hIikKbml2ZV9wbG90IDwtIHBsb3RfY2xpbV9wY2Eoc3VtbWFyeS5saXN0Lm5pdmUkbG9jLmNsaW0sIHN1bW1hcnkubGlzdC5uaXZlJHN1bW1hcnkucGNhLCBmYWN0b3IgPSAicmVwcm9kdWN0aXZlX21vZGUiKQoKbml2ZV9wbG90CgojaWYgc2VsZmNvbnRhaW5lZCA9IFRSVUUsIHlvdSBjYW4gcmVtb3ZlIHRoZSBmb2xkZXIgdGhhdCBnZXRzIGFkZGVkIGFsb25nc2lkZSB0aGUgcGxvdC4gSXQncyBhbiBhbm5veWluZyBidWcgdGhhdCBoYXNuJ3QgYmVlbiBmaXhlZCB5ZXQuCiNodG1sd2lkZ2V0czo6c2F2ZVdpZGdldChuaXZlX3Bsb3QsIHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvbml2ZWFwaGFzbWFfcGNhLmh0bWwiKSwgc2VsZmNvbnRhaW5lZCA9IFRSVUUpCgojZmlsdGVyIGxvY2FsaXRpZXMgZm9yIHRoZSBmb2NhbCBnZW51cwpuaXZlX2xvYyA8LSBsb2MgJT4lIAogIGZpbHRlcihnZW51cyA9PSAibml2ZWFwaGFzbWEiKQogIAojdXNlIHNvdXJjZWQgcGxvdF9sb2NzX2xlYWZsZXQgc2NyaXB0IHRvIHBsb3QgbG9jYWxpdGllcwpuaXZlX21hcCA8LSBwbG90X2xvY3NfbGVhZmxldChuaXZlX2xvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCm5pdmVfbWFwCgojaW4gY2FzZSBJIHdhbnQgdG8gc2F2ZSB0aGUgbWFwIHNvbWV3aGVyZQojbWFwdmlldzo6bWFwc2hvdChuaXZlX21hcCwgdXJsID0gcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9uaXZlX21hcC5odG1sIiksIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL25pdmVfbWFwLnBkZiIpKQoKYGBgCgpgYGB7cn0Kc3VtbWFyeS5saXN0Lm5pdmUkc3VtbWFyeS5wY2EKbG9hZGluZ3Mubml2ZSA8LSBzdW1tYXJ5Lmxpc3Qubml2ZSRzdW1tYXJ5LnBjYSRyb3RhdGlvbgprbml0cjo6a2FibGUocm91bmQobG9hZGluZ3Mubml2ZVssMTozXSwzKSkgI1RhYmxlIG9mIGxvYWRpbmcgc2NvcmVzIGZvciB0aGUgZmlyc3QgMyBQQ3MuIApgYGAKCgpOb3cgSSdtIGdvaW5nIHRvIHRvIGVudmlyb25tZW50YWwgbmljaGUgZmFjdG9yIGFuYWx5c2lzIGJldHdlZW4gc2V4dWFsIGFuZCBhc2V4dWFsIHBvcHVsYXRpb25zIHdpdGhpbiB0aGUgc3BlY2llcy4KYGBge3J9CiNnZXQgYmFja2dyb3VuZCBlbnYndCBmb3IgdGhlIHNwZWNpZXMKbml2ZV9iZ19lbnYgPC0gYmdfZW52X2Nyb3Aobml2ZV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImFubnVsYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgPSB3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gMC41KQoKI2VuZmEgZm9yIHRoZSBzZXh1YWwgc3BlY2llcwpuaXZlX3NleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IG5pdmVfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiYW5udWxhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBuaXZlX2JnX2VudikKCiNlbmZhIGZvciB0aGUgYXNleHVhbCBzcGVjaWVzCm5pdmVfYXNleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IG5pdmVfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImFubnVsYXRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gbml2ZV9iZ19lbnYpCgoKI3Bsb3QgdGhlIG1hcmdpbmFsaXR5IHNjb3JlcwptYXJnaW5hbGl0eV9sb2xsaXBvcChzZXhfbWFyZyA9IG5pdmVfc2V4dWFsX2VuZmEkbSwgCiAgICAgICAgICAgICAgICAgICAgYXNleF9tYXJnID0gbml2ZV9hc2V4dWFsX2VuZmEkbSwKICAgICAgICAgICAgICAgICAgICBmdWxsX3NwZWNpZXNfbmFtZSA9ICJOaXZlYXBoYXNtYSBhbm51bGF0YSIpCgpgYGAKCgojIyNTcGlub3RlY3RhcmNodXMKCmBgYHtyfQpzdW1tYXJ5Lmxpc3Quc3BpbiA8LSBzcGVjaWVzX3BjYV9mdW4obG9jLmNsaW0sICJzcGlub3RlY3RhcmNodXMiKQpzcGluX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5Lmxpc3Quc3BpbiRsb2MuY2xpbSwgc3VtbWFyeS5saXN0LnNwaW4kc3VtbWFyeS5wY2EsIGZhY3RvciA9ICJyZXByb2R1Y3RpdmVfbW9kZSIpCnNwaW5fcGxvdAoKI2lmIHNlbGZjb250YWluZWQgPSBUUlVFLCB5b3UgY2FuIHJlbW92ZSB0aGUgZm9sZGVyIHRoYXQgZ2V0cyBhZGRlZCBhbG9uZ3NpZGUgdGhlIHBsb3QuIEl0J3MgYW4gYW5ub3lpbmcgYnVnIHRoYXQgaGFzbid0IGJlZW4gZml4ZWQgeWV0LgojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoc3Bpbl9wbG90LCBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL3NwaW5vdGVjdGFyY2h1c19wY2EuaHRtbCIpLCBzZWxmY29udGFpbmVkID0gVFJVRSkKCiNmaWx0ZXIgbG9jYWxpdGllcyBmb3IgdGhlIGZvY2FsIGdlbnVzCnNwaW5fbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJzcGlub3RlY3RhcmNodXMiKQogIAojdXNlIHNvdXJjZWQgcGxvdF9sb2NzX2xlYWZsZXQgc2NyaXB0IHRvIHBsb3QgbG9jYWxpdGllcwpzcGluX21hcCA8LSBwbG90X2xvY3NfbGVhZmxldChzcGluX2xvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCnNwaW5fbWFwCgojaW4gY2FzZSBJIHdhbnQgdG8gc2F2ZSB0aGUgbWFwIHNvbWV3aGVyZQojbWFwdmlldzo6bWFwc2hvdChzcGluX21hcCwgdXJsID0gcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9zcGluX21hcC5odG1sIiksIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL3NwaW5fbWFwLnBkZiIpKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeS5saXN0LnNwaW4kc3VtbWFyeS5wY2EKbG9hZGluZ3Muc3BpbiA8LSBzdW1tYXJ5Lmxpc3Quc3BpbiRzdW1tYXJ5LnBjYSRyb3RhdGlvbgprbml0cjo6a2FibGUocm91bmQobG9hZGluZ3Muc3BpblssMTozXSwzKSkgI1RhYmxlIG9mIGxvYWRpbmcgc2NvcmVzIGZvciB0aGUgZmlyc3QgMyBQQ3MuIApgYGAKCgojIyNUZWN0YXJjaHVzCmBgYHtyfQpzdW1tYXJ5Lmxpc3QudGVjdCA8LSBzcGVjaWVzX3BjYV9mdW4obG9jLmNsaW0sICJ0ZWN0YXJjaHVzIikKdGVjdF9wbG90IDwtIHBsb3RfY2xpbV9wY2Eoc3VtbWFyeS5saXN0LnRlY3QkbG9jLmNsaW0sIHN1bW1hcnkubGlzdC50ZWN0JHN1bW1hcnkucGNhLCBmYWN0b3IgPSAicmVwcm9kdWN0aXZlX21vZGUiKQp0ZWN0X3Bsb3QKCiNpZiBzZWxmY29udGFpbmVkID0gVFJVRSwgeW91IGNhbiByZW1vdmUgdGhlIGZvbGRlciB0aGF0IGdldHMgYWRkZWQgYWxvbmdzaWRlIHRoZSBwbG90LiBJdCdzIGFuIGFubm95aW5nIGJ1ZyB0aGF0IGhhc24ndCBiZWVuIGZpeGVkIHlldC4KI2h0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KHRlY3RfcGxvdCwgcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy90ZWN0YXJjaHVzX3BjYS5odG1sIiksIHNlbGZjb250YWluZWQgPSBUUlVFKQoKI2ZpbHRlciBsb2NhbGl0aWVzIGZvciB0aGUgZm9jYWwgZ2VudXMKdGVjdF9sb2MgPC0gbG9jICU+JSAKICBmaWx0ZXIoZ2VudXMgPT0gInRlY3RhcmNodXMiKQogIAojdXNlIHNvdXJjZWQgcGxvdF9sb2NzX2xlYWZsZXQgc2NyaXB0IHRvIHBsb3QgbG9jYWxpdGllcwp0ZWN0X21hcCA8LSBwbG90X2xvY3NfbGVhZmxldCh0ZWN0X2xvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCnRlY3RfbWFwCgojaW4gY2FzZSBJIHdhbnQgdG8gc2F2ZSB0aGUgbWFwIHNvbWV3aGVyZQojbWFwdmlldzo6bWFwc2hvdCh0ZWN0X21hcCwgdXJsID0gcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy90ZWN0X21hcC5odG1sIiksIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL3RlY3RfbWFwLnBkZiIpKQpgYGAKCgoKCmBgYHtyfQpzdW1tYXJ5Lmxpc3QudGVjdCRzdW1tYXJ5LnBjYQpsb2FkaW5ncy50ZWN0IDwtIHN1bW1hcnkubGlzdC50ZWN0JHN1bW1hcnkucGNhJHJvdGF0aW9uCmtuaXRyOjprYWJsZShyb3VuZChsb2FkaW5ncy50ZWN0WywxOjNdLDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKCgpOb3cgSSdtIGdvaW5nIHRvIHRvIGVudmlyb25tZW50YWwgbmljaGUgZmFjdG9yIGFuYWx5c2lzIGJldHdlZW4gc2V4dWFsIGFuZCBhc2V4dWFsIHBvcHVsYXRpb25zIHdpdGhpbiB0aGUgc3BlY2llcy4KClRoaXMgaXMgZm9yIFRlY3RhcmNodXMgb3ZvYmVzc3VzLgpgYGB7cn0KI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwp0ZWN0X2JnX2VudiA8LSBiZ19lbnZfY3JvcCh0ZWN0X2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAib3ZvYmVzc3VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgPSB3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gMC41KQoKI2VuZmEgZm9yIHRoZSBzZXh1YWwgc3BlY2llcwp0ZWN0X3NleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IHRlY3RfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAib3ZvYmVzc3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gdGVjdF9iZ19lbnYpCgojZW5mYSBmb3IgdGhlIGFzZXh1YWwgc3BlY2llcwp0ZWN0X2FzZXh1YWxfZW5mYSA8LSBlbmZhX2NhbGNfZnVuKGxvY3MgPSB0ZWN0X2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJvdm9iZXNzdXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSB0ZWN0X2JnX2VudikKCgojcGxvdCB0aGUgbWFyZ2luYWxpdHkgc2NvcmVzCm1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gdGVjdF9zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSB0ZWN0X2FzZXh1YWxfZW5mYSRtLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIlRlY3RhcmNodXMgb3ZvYmVzc3VzIikKCmBgYAoKVGhpcyBpcyBhbiBlbmZhIGZvciBUZWN0YXJjaHVzIGh1dHRvbmkuCmBgYHtyfQojZ2V0IGJhY2tncm91bmQgZW52J3QgZm9yIHRoZSBzcGVjaWVzCnRlY3RfYmdfZW52IDwtIGJnX2Vudl9jcm9wKHRlY3RfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJodXR0b25pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgPSB3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gMC41KQoKI2VuZmEgZm9yIHRoZSBzZXh1YWwgc3BlY2llcwp0ZWN0X3NleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IHRlY3RfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaHV0dG9uaSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IHRlY3RfYmdfZW52KQoKI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXMKdGVjdF9hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gdGVjdF9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaHV0dG9uaSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IHRlY3RfYmdfZW52KQoKCiNwbG90IHRoZSBtYXJnaW5hbGl0eSBzY29yZXMKbWFyZ2luYWxpdHlfbG9sbGlwb3Aoc2V4X21hcmcgPSB0ZWN0X3NleHVhbF9lbmZhJG0sIAogICAgICAgICAgICAgICAgICAgIGFzZXhfbWFyZyA9IHRlY3RfYXNleHVhbF9lbmZhJG0sCiAgICAgICAgICAgICAgICAgICAgZnVsbF9zcGVjaWVzX25hbWUgPSAiVGVjdGFyY2h1cyBodXR0b25pIikKCmBgYAoKCiMjI1RlcGFraXBoYXNtYQpOb3RoaW5nLiBPbmx5IG9uZSBsb2NhbGl0eS4KCg==